grammar Calculator; // combined grammars that can contain both lexical and parser rules
// parser rules，以小写字母开头
prog: stat+; // 允许一次执行多个表达式

// 定义语句，在每个可选方案后面，使用#开头定义label
stat: expr EOF # PrintExpr
    | ID '=' expr EOF # Assign
    ;

// 定义表达式，支持加减乘除、括号
expr: expr op=(MUL|DIV) expr # MulDiv
    | expr op=(ADD|SUB) expr # AddSub
    | INT # Constant
    | ID # Variable
    | '(' expr ')' # Parentheses
    ;

// lexer rules，以大写字母开头，一般全为大写
// 定义运算符
MUL: '*';
DIV: '/';
ADD: '+';
SUB: '-';

// 定义常量、变量
INT: [0-9]+;
ID: [a-zA-Z]+;

// 定义可以skip的换行符、tab等
WS: [ \t\r\n]+ -> skip;
